/**
 * 
 */
package gwtool.gui.dataSetTable;

import gwtool.container.DataSet;
import gwtool.container.DataSetItem;
import gwtool.container.Gruppe;
import gwtool.drucken.DruckController;
import gwtool.gui.MainController;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JOptionPane;

/**
 * @author Christian
 * 
 */
public class DataSetTableController implements ActionListener {

	private DataSetTablePanel panel = null;

	private MainController mainControlller = MainController.getInstance();

	private DataSetTabelModel model;

	public DataSetTableController(DataSetTablePanel panel) {

		this.panel = panel;
		model = new DataSetTabelModel(this);
		model.aktualisiere();
		if (mainControlller != null) {
			mainControlller.setTableController(this);
		}
		fillGruppenComboBox();
	}

	private void bearbeiten() {

		int i = panel.getDataSetTable().convertRowIndexToModel(panel.getDataSetTable().getSelectedRow());
		if (i >= 0) {
			mainControlller.showDataSetTab((DataSet) model.getValueAt(i, 0));
		}
	}

	public void fillGruppenComboBox() {

		DefaultComboBoxModel<Gruppe> model = new DefaultComboBoxModel<>();
		model.addElement(new Gruppe(-1, "Alle", 1, 1));
		for (Gruppe g : MainController.getInstance().getDataController().getBenutzter().getGruppen()) {
			model.addElement(g);
		}
		panel.getGruppenComboBox().setModel(model);
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() instanceof JButton) {

			if (e.getSource() == panel.getBtnDrucken()) {
				drucken();
			}

			if (e.getSource() == panel.getBearbeitenButton()) {
				bearbeiten();
			}
			if (e.getSource() == panel.getCommitButton()) {
				mainControlller.closeAllTabs();
				mainControlller.getDataController().getComm().startOnlineUpdate(false);
			}
			if (e.getSource() == panel.getNeuButton()) {
				Object[] gruppen = mainControlller.getDataController().getBenutzter().getGruppeMitSchreibRechenten()
						.toArray();
				if (gruppen.length == 0) {
					JOptionPane.showMessageDialog(panel, "Ohne Schreibrechte können keine Einträge erstellt werden.");
					return;
				}
				Object geraeteType = JOptionPane.showInputDialog(panel, "Was soll erstellt werden?", "Neu",
						JOptionPane.QUESTION_MESSAGE, null, DataSet.getMoeglicheTypen(), null);
				if (geraeteType == null) {
					return;
				}
				Gruppe gruppe = (Gruppe) JOptionPane.showInputDialog(panel,
						"Welcher Nutzergruppe soll der Eintrag angehören??", "Neu", JOptionPane.QUESTION_MESSAGE, null,
						gruppen, null);
				if (geraeteType != null && gruppe != null) {
					DataSetItem item = DataSet.createNewItemByType(geraeteType.toString());
					DataSet newSet = new DataSet(-1, -1, gruppe.getId());
					newSet.addNewDataSetItem(item);
					newSet.setChanged(true);
					mainControlller.getDataController().getDataSetList().add(newSet);
					model.aktualisiere();
					mainControlller.showDataSetTab(newSet);
				}
			}
			if (e.getSource() == panel.getDelButton()) {

				if (panel.getDataSetTable().getSelectedRowCount() == 1) {
					int i = panel.getDataSetTable().getSelectedRow();
					if (i >= 0) {
						DataSet dataSet = (DataSet) model.getValueAt(i, 0);
						int ans = JOptionPane.showConfirmDialog(panel, "Soll der Eintrag "
								+ dataSet.getAktuellesDataItem().toString() + " wirklich gelöscht werden?", "Löschen?",
								JOptionPane.YES_NO_OPTION);
						if (ans == JOptionPane.YES_OPTION) {
							dataSet.setDeleted(true);
							MainController.getInstance().closeTab(dataSet);
							model.aktualisiere();
						}
					}
				} else {
					JOptionPane.showMessageDialog(panel, "Zum Löschen darf/muss nur 1 Eintrag gewählt sein!");
				}
			}
		}
	}

	private void drucken() {

		if (mainControlller.gibtEsNichtGespeicherteAenderungen()) {
			int ans = JOptionPane.showConfirmDialog(null, "Sollen die Änderungen vor dem Schließen gespeichert werden?",
					"Speichern?", JOptionPane.YES_NO_OPTION);
			if (ans == JOptionPane.YES_OPTION) {
				mainControlller.alleSpeichern();
			}
		}

		if (panel.getDataSetTable().getSelectedRowCount() > 0) {
			List<DataSetItem> items = new ArrayList<>();
			for (int i : panel.getDataSetTable().getSelectedRows()) {
				int iconverted = panel.getDataSetTable().convertRowIndexToModel(i);

				items.add(((DataSet) model.getValueAt(iconverted, 0)).getAktuellesDataItem());
			}
			new DruckController().druckeItem(items);
		} else {
			JOptionPane.showMessageDialog(panel, "Es muss mindestens 1 Eintrag gewählt sein!");
		}
	}

	public void addTableMouseListner() {

		panel.getDataSetTable().addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent me) {

				if (me.getClickCount() == 2) {
					bearbeiten();
				}
			}
		});
	}

	public DataSetTablePanel getPanel() {

		return panel;
	}

	public DataSetTabelModel getModel() {

		return model;
	}

	// public void updateGui() {
	//
	// panel.getDataSetTable().
	// }
}
